package com.fks.fks_service.utils;



import com.fks.fks_service.pojo.WPhone;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class WPhoneUtils {

    private static final Pattern CHINA_PATTERN = Pattern.compile("^((13[0-9])|(14[0,1,4-9])|(15[0-3,5-9])|(16[2,5,6,7])|(17[0-8])|(18[0-9])|(19[0-3,5-9]))\\d{8}$");

    /**
     * 大陆手机号码11位数，匹配格式：前三位固定格式+后8位任意数
     * 此方法中前三位格式有：
     * 13+任意数
     * 145,147,149
     * 15+除4的任意数(不要写^4，这样的话字母也会被认为是正确的)
     * 166
     * 17+3,5,6,7,8
     * 18+任意数
     * 198,199
     */
    public static boolean isChinaPhone(String phoneStr) {
        if (phoneStr == null || phoneStr.length() == 0) {
            return false;
        }
        Matcher m = CHINA_PATTERN.matcher(phoneStr);
        return m.matches();
    }

    /**
     * 中国电信号段
     * 133、153、173、177、180、181、189、190、191、193、199
     * 中国联通号段
     * 130、131、132、145、155、156、166、167、171、175、176、185、186、196
     * 中国移动号段
     * 134(0-8)、135、136、137、138、139、1440、147、148、150、151、152、157、158、159、172、178、182、183、184、187、188、195 [1]  、197、198
     * 中国广电号段
     * 192
     * 其他号段
     * 14号段部分为上网卡专属号段：中国联通145，中国移动147，中国电信149.
     * 虚拟运营商：
     * 电信：1700、1701、1702、162
     * 移动：1703、1705、1706、165
     * 联通：1704、1707、1708、1709、171、167
     * 卫星通信：1349、174
     * 物联网：140、141、144、146、148
     */
    public static WPhone checkChinaPhone(String phoneStr) {
        WPhone wPhone = isChinaOtherPhone(phoneStr);
        wPhone.setPhoneNumber(phoneStr);
        //其他号段
        if (wPhone.isPhone()) {
            return wPhone;
        }
        //中国移动号段
        wPhone = isChinaMobilePhone(phoneStr);
        if (wPhone.isPhone()) {
            return wPhone;
        }
        //中国电信号段
        wPhone = isChinaTelecomPhone(phoneStr);
        if (wPhone.isPhone()) {
            return wPhone;
        }
        //中国联通号段
        wPhone = isChinaUnicomPhone(phoneStr);
        if (wPhone.isPhone()) {
            return wPhone;
        }
        //中国广电号段
        wPhone = isChinaBroadcastPhone(phoneStr);
        if (wPhone.isPhone()) {
            return wPhone;
        }
        wPhone.setMsg("不是手机号");
        return wPhone;
    }

    /**
     * 中国移动号段
     * 134(0-8)、135、136、137、138、139、1440、147、148、150、151、152、157、158、159、172、178、182、183、184、187、188、195 、197、198
     */
    private static WPhone isChinaMobilePhone(String phoneStr) {
        WPhone wPhone = new WPhone(false,"不属于中国移动");
        wPhone.setPhoneNumber(phoneStr);
        if (phoneStr == null || phoneStr.length() == 0) {
            return wPhone;
        }
        //号码检测
        String regExp = "(^((13[5,6,7,8,9])|(14[7,8])|(15[0,1,2,7,8,9])|(17[2,8])|(18[2,3,4,7,8])|(19[5,7,8]))\\d{8}$)|(^(134[0-8])\\d{7}$)|(^(1440[0-8])\\d{6}$)";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("中国移动");
        }
        return wPhone;
    }

    /**
     * 中国电信号段
     * 133、153、173、177、180、181、189、190、191、193、199
     */
    private static WPhone isChinaTelecomPhone(String phoneStr) {
        WPhone wPhone = new WPhone(false,"不属于中国电信");
        wPhone.setPhoneNumber(phoneStr);
        if (phoneStr == null || phoneStr.length() == 0) {
            return wPhone;
        }
        //号码检测
        String regExp = "^((133)|(153)|(17[3,7])|(18[0,1,9])|(19[0,1,3,9]))\\d{8}$";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("中国电信");
        }
        return wPhone;
    }

    /**
     * 中国联通号段
     * 130、131、132、145、155、156、166、167、171、175、176、185、186、196
     */
    private static WPhone isChinaUnicomPhone(String phoneStr) {
        WPhone wPhone = new WPhone(false,"不属于中国联通");
        wPhone.setPhoneNumber(phoneStr);
        if (phoneStr == null || phoneStr.length() == 0) {
            return wPhone;
        }
        //号码检测
        String regExp = "^((13[0,1,2])|(145)|(15[5,6])|(16[6,7])|(17[1,5,6])|(18[5,6])|(19[6]))\\d{8}$";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("中国广电");
        }
        return wPhone;
    }

    /**
     * 中国广电号段
     * 192
     */
    private static WPhone isChinaBroadcastPhone(String phoneStr) {
        WPhone wPhone = new WPhone(false,"不属于中国广电");
        wPhone.setPhoneNumber(phoneStr);
        if (phoneStr == null || phoneStr.length() == 0) {
            return wPhone;
        }
        //号码检测
        String regExp = "^(192)\\d{8}$";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("中国广电");
        }
        return wPhone;
    }

    /**
     * 其他号段
     * 14号段部分为上网卡专属号段：中国联通145，中国移动147，中国电信149.
     * 虚拟运营商：
     * 电信：1700、1701、1702、162
     * 移动：1703、1705、1706、165
     * 联通：1704、1707、1708、1709、171、167
     * 卫星通信：1349、174
     * 物联网：140、141、144、146、148
     */
    private static WPhone isChinaOtherPhone(String phoneStr) {
        WPhone wPhone = new WPhone(false,"不属于其他号段");
        wPhone.setPhoneNumber(phoneStr);
        if (phoneStr == null || phoneStr.length() == 0) {
            return wPhone;
        }
        //上网卡-中国联通
        String regExp = "^(145)\\d{8}$";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("上网卡-中国联通");
            return wPhone;
        }
        //上网卡-中国移动
        regExp = "^(147)\\d{8}$";
        p = Pattern.compile(regExp);
        m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("上网卡-中国移动");
            return wPhone;
        }
        //上网卡-中国电信
        regExp = "^(149)\\d{8}$";
        p = Pattern.compile(regExp);
        m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("上网卡-中国电信");
            return wPhone;
        }
        //虚拟运营商-电信(1700、1701、1702、162)
        regExp = "(^(170[0,1,2])\\d{7}$)|(^(162)\\d{8}$)";
        p = Pattern.compile(regExp);
        m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("虚拟运营商-电信");
            return wPhone;
        }
        //虚拟运营商-移动(1703、1705、1706、165)
        regExp = "(^(170[3,5,6])\\d{7}$)|(^(165)\\d{8}$)";
        p = Pattern.compile(regExp);
        m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("虚拟运营商-移动");
            return wPhone;
        }
        //虚拟运营商-联通(1704、1707、1708、1709、171、167)
        regExp = "(^(170[4,7,8,9])\\d{7}$)|(^((167)|(171))\\d{8}$)";
        p = Pattern.compile(regExp);
        m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("虚拟运营商-联通");
            return wPhone;
        }
        //卫星通信-移动(1349)
        regExp = "(^(1349)\\d{7}$)";
        p = Pattern.compile(regExp);
        m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("卫星通信-移动");
            return wPhone;
        }
        //卫星通信-电信(174(0-5))
        regExp = "(^(174[0-5])\\d{7}$)";
        p = Pattern.compile(regExp);
        m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("卫星通信-电信");
            return wPhone;
        }
        //物联网-电信(1410)
        regExp = "(^(1410[0-9])\\d{6}$)";
        p = Pattern.compile(regExp);
        m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("物联网-电信");
            return wPhone;
        }
        //物联网-移动(148,1440)
        regExp = "(^(1440[0-9])\\d{6}$)|(^(148[0-9])\\d{7}$)";
        p = Pattern.compile(regExp);
        m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("物联网-移动");
            return wPhone;
        }
        //物联网-联通(1400,146)
        regExp = "(^(1400[0-9])\\d{6}$)|(^(146[0-9])\\d{7}$)";
        p = Pattern.compile(regExp);
        m = p.matcher(phoneStr);
        if (m.matches()) {
            wPhone.setPhone(true);
            wPhone.setMsg("物联网-联通");
            return wPhone;
        }
        return wPhone;
    }
}
